\subsection{Gestion multiprocesseur}

\paragraph{Présentation}
La gestion des machines multiprocesseurs permet d'exécuter différents \textit{threads} sur des processeurs différents.
Pour cela il faut créer des \textit{threads} noyaux sur lesquels s'exécutent les \textit{threads} utilisateurs.
Cette gestion permet d'augmenter la rapidité de traitement de certains programmes.

\paragraph{Implémentation}
Nous avons tout d'abord dû réaliser une fonction obtenant le nombre de processeurs sur la machine utilisant le programme.
Nous créons ensuite un tableau de \textit{threads} noyaux ayant autant de champs qu'il y a de processeurs (appelé \textsf{nbProc} par la suite).
Nous utilisons l'appel système \texttt{clone} pour créer les \textit{threads} noyaux et récupérons leur \textit{pid} dans un tableau. Cela sera utile par la suite.

Les \textit{threads} noyaux exécutent une fonction appelant \texttt{thread\_{}next()} toutes les secondes, permettant de faire circuler les \textit{threads} utilisateurs. Il faut maintenant récupérer la \verb+place+ du \textit{thread} noyau exécutant ce code, nous avons besoin du tableau de \textit{pid} pour cela. Une fois ceci fait, on peut changer le \textit{thread} courant pour chacun des \textit{threads} noyaux. Nous avons dû protéger la liste des \textit{threads} à exécuter avec des \textit{mutex}, car chacun des \textit{threads} noyaux pouvait y avoir accès, et donc décider de prendre le même \textit{thread} dans la liste.

Un problème différent s'est posé. Il faut terminer le programme lorsque tous les \textit{threads} ont fini d'être exécutés. Nous avons dû créer une fonction vérifiant cela en mettant une variable globale à 1, indiquant aux \textit{threads} noyaux qu'ils doivent se terminer.

\paragraph{Tests}
Nous avons encore des problèmes non résolus sur la gestion des machines multiprocesseurs. Les tests principalement réalisés à l'aide de \texttt{example.c} nous ont permis de comprendre plusieurs choses sur l'état actuel du programme : 
\begin{itemize}
\item Il y a des \textit{free} de zones déjà allouées, après une examination du code et de l'utilisation de logiciels aidant au débogage comme \textsf{Valgrind}, nous n'avons pas trouvé la cause de ce problème.
\item La liste des \textit{threads} à exécuter n'est pas vidée correctement alors qu'il n'y a plus de \textit{threads} à exécuter, ce qui empêche le programme d'arrêter correctement les \textit{threads} noyaux. 
\end{itemize}
De plus, certaines parties avancées implémentées ne sont pas faites pour gérer le multiprocesseur, il aurait fallu revoir une grande partie de notre projet pour mettre en commun toutes ces parties.
